/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package logica;


import fisica.AntecedenteOcupacionalFisica;
import fisica.CapaFisica;
import hibernate.objeto.Antecedente;
import hibernate.objeto.AntecedenteOcupacional;
import java.text.SimpleDateFormat;
import java.util.Collections;
import java.util.Date;
import java.util.Vector;

/**
 *
 * @author Gonzalo
 */
public class AntecedenteOcupacionalLogica extends CapaLogica {

    /**
     * Crea y persiste el objeto Antecedente Ocupacional.
     *
     * @param datosAntecedentesOcupacional Los datos correspondientes al apartado
     * Antecedentes Ocupacional
     * @param antecedente El antecedente al cual se asocia
     * @return true si se agregó/modificó correctamente, false en caso contrario
     */
    public static boolean agregarAntecedenteOcupacional(
            String[] datosAntecedentesOcupacional, Antecedente antecedente) {
        if (seDebeCrearAntecedenteOcupacional(datosAntecedentesOcupacional)) {
            //Crea el objeto Antecedenete Ocupacional
            AntecedenteOcupacional antecedenteOcupacional =
                    crearObjetoAntecedenteOcupacional(
                    datosAntecedentesOcupacional, antecedente);

            //Persiste el objeto
            CapaFisica.guardarOActualizarObjeto(antecedenteOcupacional);
            return true;
        } else {
            return true;
        }
    }

    /**
     * Crea un objeto AntecedenteOcupacional con los datos pasados por parámetro.
     *
     * @param datosAntecedentesOcupacional Los datos particulares del objeto
     * @param antecedente El antecedente al cual se asocia
     * @return El objeto AntecedenteOcupacional recien creado
     */
    private static AntecedenteOcupacional crearObjetoAntecedenteOcupacional(
            String[] datosAntecedentesOcupacional, Antecedente antecedente){

        AntecedenteOcupacional antecedenteOcupacional =
                new AntecedenteOcupacional();

        antecedenteOcupacional.setAntecedente(antecedente);

        antecedenteOcupacional.setFechaAntecedenteOcupacional(new Date());

        antecedenteOcupacional.setInorganicoMinaAntecedenteOcupacional(
                datosAntecedentesOcupacional[ANTECEDENTE_OCUPACIONAL_INORGANICOS_1]);

        antecedenteOcupacional.setInorganicoPiedraAntecedenteOcupacional(
                datosAntecedentesOcupacional[ANTECEDENTE_OCUPACIONAL_INORGANICOS_2]);

        antecedenteOcupacional.setInorganicoAbrasivosAntecedenteOcupacional(
                datosAntecedentesOcupacional[ANTECEDENTE_OCUPACIONAL_INORGANICOS_3]);

        antecedenteOcupacional.setInorganicoFundicionAntecedenteOcupacional(
                datosAntecedentesOcupacional[ANTECEDENTE_OCUPACIONAL_INORGANICOS_4]);

        antecedenteOcupacional.setInorganicoCeramicaAntecedenteOcupacional(
                datosAntecedentesOcupacional[ANTECEDENTE_OCUPACIONAL_INORGANICOS_5]);

        antecedenteOcupacional.setInorganicoCementoAntecedenteOcupacional(
                datosAntecedentesOcupacional[ANTECEDENTE_OCUPACIONAL_INORGANICOS_6]);

        antecedenteOcupacional.setInorganicoLimpiezaAntecedenteOcupacional(
                datosAntecedentesOcupacional[ANTECEDENTE_OCUPACIONAL_INORGANICOS_7]);

        antecedenteOcupacional.setInorganicoPigmentosAntecedenteOcupacional(
                datosAntecedentesOcupacional[ANTECEDENTE_OCUPACIONAL_INORGANICOS_8]);

        antecedenteOcupacional.setInorganicoVidrioAntecedenteOcupacional(
                datosAntecedentesOcupacional[ANTECEDENTE_OCUPACIONAL_INORGANICOS_9]);

        antecedenteOcupacional.setInorganicoMantosAntecedenteOcupacional(
                datosAntecedentesOcupacional[ANTECEDENTE_OCUPACIONAL_INORGANICOS_10]);

        antecedenteOcupacional.setInorganicoConstruccionAntecedenteOcupacional(
                datosAntecedentesOcupacional[ANTECEDENTE_OCUPACIONAL_INORGANICOS_11]);

        antecedenteOcupacional.setInorganicoRevestimientosAntecedenteOcupacional(
                datosAntecedentesOcupacional[ANTECEDENTE_OCUPACIONAL_INORGANICOS_12]);

        antecedenteOcupacional.setInorganicoAislamientosAntecedenteOcupacional(
                datosAntecedentesOcupacional[ANTECEDENTE_OCUPACIONAL_INORGANICOS_13]);

        antecedenteOcupacional.setInorganicoTextilAntecedenteOcupacional(
                datosAntecedentesOcupacional[ANTECEDENTE_OCUPACIONAL_INORGANICOS_14]);

        antecedenteOcupacional.setInorganicoNavalAntecedenteOcupacional(
                datosAntecedentesOcupacional[ANTECEDENTE_OCUPACIONAL_INORGANICOS_15]);

        antecedenteOcupacional.setInorganicoAislanteAntecedenteOcupacional(
                datosAntecedentesOcupacional[ANTECEDENTE_OCUPACIONAL_INORGANICOS_16]);

        antecedenteOcupacional.setInorganicoFrenosAntecedenteOcupacional(
                datosAntecedentesOcupacional[ANTECEDENTE_OCUPACIONAL_INORGANICOS_17]);

        antecedenteOcupacional.setInorganicoEmbriagueAntecedenteOcupacional(
                datosAntecedentesOcupacional[ANTECEDENTE_OCUPACIONAL_INORGANICOS_18]);

        antecedenteOcupacional.setInorganicoEmpaqueAntecedenteOcupacional(
                datosAntecedentesOcupacional[ANTECEDENTE_OCUPACIONAL_INORGANICOS_19]);

        antecedenteOcupacional.setGasesAntecedenteOcupacional(
                datosAntecedentesOcupacional[ANTECEDENTE_OCUPACIONAL_GASES]);

        antecedenteOcupacional.setOrganicoAntecedenteOcupacional(
                datosAntecedentesOcupacional[ANTECEDENTE_OCUPACIONAL_ORGANICOS]);

        antecedenteOcupacional.setTareasRuralesAntecedenteOcupacional(
                datosAntecedentesOcupacional[ANTECEDENTE_OCUPACIONAL_TAREAS_RURALES]);

        antecedenteOcupacional.setAsmaOcupacionalAntecedenteOcupacional(
                datosAntecedentesOcupacional[ANTECEDENTE_OCUPACIONAL_ASMA]);

        antecedenteOcupacional.setOtrasEnfermedadesAntecedenteOcupacional(
                datosAntecedentesOcupacional[ANTECEDENTE_OCUPACIONAL_OTRAS_ENFERMEDADES]);

        return antecedenteOcupacional;
    }

    /**
     * Cheque si los datos son nulos.
     *
     * @param datosAntecedentesOcupacional Los datos a agregar
     * @return true si se debe crear el objeto AntecedenteOcupacional, false
     * en caso contrario
     */
    private static boolean seDebeCrearAntecedenteOcupacional(String[]
            datosAntecedentesOcupacional) {

        for (int i = 0; i < datosAntecedentesOcupacional.length; i++) {
            if (!datosAntecedentesOcupacional[i].equals("")) {
                return true;
            }
        }

        return false;
    }

    /**
     * Retorna el vector de objetos AntecedenteOcupacional según el id del paciente
     * ordenado decrecientemente por la fecha.
     *
     * @param idPaciente El id del paciente consultado
     * @return El vector de objetos AntecedenteOcupacional consultado, null si no
     * existe
     */
    public static Vector<AntecedenteOcupacional>
            getVectorAntecedenteOcupacionalPorIdPaciente(int idPaciente) {
        Vector<AntecedenteOcupacional> vectorAntecedenteOcupacional =
                AntecedenteOcupacionalFisica.getVectorAntecedenteOcupacionalPorIdPaciente(
                idPaciente);
        if (vectorAntecedenteOcupacional != null) {
            Collections.reverse(vectorAntecedenteOcupacional);
        }

        return vectorAntecedenteOcupacional;
    }

    /**
     * Retorna el último antecedente ocupacional cargado del paciente.
     *
     * @param idAntecedente El id del antecedente asociado
     * @return El objeto AntecedenteOcupacional consultado, null si no existe
     */
    public static AntecedenteOcupacional
            getAntecedenteOcupacionalMasRecientePorIdAntecedente(
            int idAntecedente) {
        Vector<AntecedenteOcupacional> antecedenteOcupacional =
                AntecedenteOcupacionalFisica.
                getVectorAntecedenteOcupacionalPorIdAntecedente(idAntecedente);

        if (antecedenteOcupacional != null) {
            return antecedenteOcupacional.lastElement();
        } else {
            return null;
        }
    }

    /**
     * Retorna un arreglo de strings con las fechas de los objetos del vector.
     *
     * @param vectorAntecedenteOcupacional El vector de objetos AntecedenteOcupacional
     * @return Un arreglo de strings con las fechas de los antecedentes
     */
    public static String[] getListaDeFechaAntecedenteOcupacional(
            Vector<AntecedenteOcupacional> vectorAntecedenteOcupacional) {
        // El ComboBox necesita para ser cargado un arreglo de strings, por lo
        // que se crea
        String[] arregloStringAntecedenteOcupacional = vectorAArregloString(
                vectorAntecedenteOcupacional);

        return arregloStringAntecedenteOcupacional;
    }

    /**
     * Convierte un vector de AntecedenteOcupacional en un arreglo de las fechas
     * de los objetos.
     *
     * @param vectorAntecedenteOcupacional El vector de objetos AntecedenteOcupacional
     * @return La lista resultante cargada
     */
    private static String[] vectorAArregloString(
            Vector<AntecedenteOcupacional> vectorAntecedenteOcupacional) {

        int tamaño = vectorAntecedenteOcupacional.size() + 1;
        String[] arregloStringModificado = new String[tamaño];

        String primerElemento = "";

        arregloStringModificado[0] = primerElemento;
        SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
        String formattedDate;

        for (int i = 0; i < vectorAntecedenteOcupacional.size(); i++){
            formattedDate = formatter.format(vectorAntecedenteOcupacional.get(i).
                    getFechaAntecedenteOcupacional());
            arregloStringModificado[i+1] = "Nº " + i + ": " + formattedDate;
        }

        return arregloStringModificado;
    }

}
